/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package jhelper.blls;

import java.io.File;
import java.io.FileWriter;
import java.util.Hashtable;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;


import jhelper.models.AddressBookBean;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

/**
 *
 * @author Administrator
 */
public class AddressBook {

    public boolean newCard(AddressBookBean newcard) {
        //把newcard通讯录对象存起来
        Document doc;
        Element addressbook, card;
        Element name, mobile, office, home, qq, email, other;
        boolean flag = false;

        try {
            DocumentBuilderFactory f = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = f.newDocumentBuilder();

            File file = new File("addressbook");
            if (!file.exists()) {
                file.mkdir();
            }
            file = new File("addressbook/addressbook.xml");
            if (!file.exists()) {
                flag = true;
                file.createNewFile();
                doc = db.newDocument();
                addressbook = doc.createElement("addressbook");
            } else {
                doc = db.parse(file);
                addressbook = (Element) doc.getElementsByTagName("addressbook").item(0);
            }
            // 构建card元素， 它是name等元素的父元素
            card = doc.createElement("card");

            name = doc.createElement("name");
            mobile = doc.createElement("mobile");
            office = doc.createElement("offcie");
            home = doc.createElement("home");
            qq = doc.createElement("qq");
            email = doc.createElement("email");
            other = doc.createElement("other");
            // 为name等元素添加文本节点内容，内容来自于newcard参数中的属性。
            name.appendChild(doc.createTextNode(newcard.getName()));
            mobile.appendChild(doc.createTextNode(newcard.getMobile()));
            office.appendChild(doc.createTextNode(newcard.getOffice()));
            home.appendChild(doc.createTextNode(newcard.getHome()));
            qq.appendChild(doc.createTextNode(newcard.getQq()));
            email.appendChild(doc.createTextNode(newcard.getEmail()));
            other.appendChild(doc.createTextNode(newcard.getOther()));

            card.appendChild(name);
            card.appendChild(mobile);
            card.appendChild(office);
            card.appendChild(home);
            card.appendChild(qq);
            card.appendChild(email);
            card.appendChild(other);

            addressbook.appendChild(card);
            if (flag) {
                doc.appendChild(addressbook);
            }

            // 各元素之间的关系确定以后，需要dom转换成xml
            TransformerFactory ff = TransformerFactory.newInstance();
            Transformer t = ff.newTransformer();
            FileWriter fout = new FileWriter(file);
            t.transform(new DOMSource(doc), new StreamResult(fout));
            return true;

        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }

    }
/**
     * 
     * @param oldcard
     * @return 
     * 按照oldcard来修改xml文件中对应的card，对应关系是name元素，不可以修改name
     * 1。 判断xml文件是否存在，如果不存在，return false
     * 2。 解析文件 => doc 文档对象
     * 3。 得到card的nodelist
     * 4。 循环node，查找节点node中的name值是否与oldcard的name值相等，用的方法是equals()
     * 5.  如果相等，根据oldcard对象构造一个newcard卡片。
     * 6。 有这个newcard替换card   addressbook.replace();
     */
    public boolean modifyCard(AddressBookBean oldcard) {

        Document doc;
        NodeList cards;
        Element addressbook, card, newcard, oldname;
        Element name, mobile, office, home, qq, email, other;

        try {
            DocumentBuilderFactory f = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = f.newDocumentBuilder();

            File file = new File("addressbook/addressbook.xml");
            if (!file.exists()) {
                return false;
            }

            doc = db.parse(file);
            addressbook = (Element) doc.getElementsByTagName("addressbook").item(0);

            cards = doc.getElementsByTagName("card");

            for (int i = 0; i < cards.getLength(); i++) {
                card = (Element) cards.item(i);
                oldname = (Element) card.getElementsByTagName("name").item(0);
                if (oldname.getFirstChild().getNodeValue().equals(oldcard.getName())) {

                    newcard = doc.createElement("card");
                    name = doc.createElement("name");
                    mobile = doc.createElement("mobile");
                    office = doc.createElement("offcie");
                    home = doc.createElement("home");
                    qq = doc.createElement("qq");
                    email = doc.createElement("email");
                    other = doc.createElement("other");

                    name.appendChild(doc.createTextNode(oldcard.getName()));
                    mobile.appendChild(doc.createTextNode(oldcard.getMobile()));
                    office.appendChild(doc.createTextNode(oldcard.getOffice()));
                    home.appendChild(doc.createTextNode(oldcard.getHome()));
                    qq.appendChild(doc.createTextNode(oldcard.getQq()));
                    email.appendChild(doc.createTextNode(oldcard.getEmail()));
                    other.appendChild(doc.createTextNode(oldcard.getOther()));

                    newcard.appendChild(name);
                    newcard.appendChild(mobile);
                    newcard.appendChild(office);
                    newcard.appendChild(home);
                    newcard.appendChild(qq);
                    newcard.appendChild(email);
                    newcard.appendChild(other);
                    
                    
                    addressbook.replaceChild(newcard, card);
                   
                    TransformerFactory ff = TransformerFactory.newInstance();
                    Transformer t = ff.newTransformer();
                    FileWriter fout = new FileWriter(file);
                    t.transform(new DOMSource(doc), new StreamResult(fout));
                    return true;
                }
            }
            return false;

        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    public boolean delCard(String name) {

        return true;
    }

    public Hashtable getAllCards() {

        return null;
    }

    public static void main(String[] args) {

        AddressBookBean newcard = new AddressBookBean("张三", "1331111111", "0771255555", "077125550000", "11111111", "aa@", "no");
        AddressBook ab = new AddressBook();
//        ab.newCard(newcard);
        
        AddressBookBean oldcard = new AddressBookBean("张三", "1380000000", "0771250005", "077125550000", "11111111", "ccc@", "yes");
        ab.modifyCard(oldcard);
    }
}
